package com.tzy.parser.core.strategy;

import com.tzy.parser.core.AttributeParser;
import com.tzy.parser.core.Constant;
import com.tzy.parser.exception.MetaObjNameException;

import java.math.BigDecimal;

public class CompareTemplateStrategy implements TemplateStrategy {


    private AttributeParser parser;

    @Override
    public String strategyName() {
        return "compare";
    }

    public CompareTemplateStrategy(AttributeParser parser) {

        this.parser = parser;
    }

    @Override
    public boolean canParse(String template) {
        return Constant.isCompareOperations(template.trim());
    }

    @Override
    public Object parse(String template, Object meta) {

        template = template.trim();

        String[] strings = template.split(" ");

        if (strings.length != 3) {
            throw new MetaObjNameException(template + "无法解析");
        }

        switch (strings[1]) {
            case Constant.EQ:
                return parser.baseParse(meta, strings[0]).equals(parser.baseParse(meta, strings[2]));
            case Constant.LT:
                return new BigDecimal(parser.baseParse(meta, strings[0]).toString()).subtract(new BigDecimal(parser.baseParse(meta, strings[2]).toString())).intValue() < 0;
            case Constant.LTE:
                return new BigDecimal(parser.baseParse(meta, strings[0]).toString()).subtract(new BigDecimal(parser.baseParse(meta, strings[2]).toString())).intValue() <= 0;
            case Constant.GT:
                return new BigDecimal(parser.baseParse(meta, strings[0]).toString()).subtract(new BigDecimal(parser.baseParse(meta, strings[2]).toString())).intValue() > 0;
            case Constant.GTE:
                return new BigDecimal(parser.baseParse(meta, strings[0]).toString()).subtract(new BigDecimal(parser.baseParse(meta, strings[2]).toString())).intValue() >= 0;
        }

        throw new MetaObjNameException(template + "无法解析");
    }
}
